package com.lijin.download;

import org.apache.commons.lang.StringUtils;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.LinkOption;
import java.nio.file.Paths;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Set;
import java.util.TreeSet;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public abstract class FileUtils {

    /**
     *  如果文件路径不存在就创建
     * @param path          需要判断的文件路径
     * @param defaultPath   默认的文件路径
     * @return
     */
    public static String notExist2Create(String path,String defaultPath){
        if(validatePathExist(path)){return path;}
        System.err.printf("自定义的保存文件不存在,即将使用默认的文件地址：%s",defaultPath);
        if(validatePathExist(defaultPath)){return defaultPath;}
        System.err.println("默认地址不存在，即将创建");
        try {
            Files.createDirectory(Paths.get(defaultPath));
        } catch (IOException e) {
            throw new RuntimeException("创建文件路径失败",e);
        }
        return defaultPath;
    }

    /**
     *  判断路径是否存在
     * @param path
     * @return
     */
    public static boolean validatePathExist(String path){
        return Files.exists(Paths.get(path), new LinkOption[]{ LinkOption.NOFOLLOW_LINKS});
    }

    /**
     *  解析url
     * @param content
     * @return
     */
    public static TreeSet<String> resolveUrl(String content){
        if(StringUtils.isBlank(content)){
            throw new RuntimeException("m3u8文件内容为空!");
        }
        //通过换行符进行切割
        TreeSet<String> urls = new TreeSet<>();
        Pattern r = Pattern.compile("(http|https)\\S{1,}");
        Matcher m = r.matcher(content);

        while(m.find()) urls.add(m.group());
        return urls;
    }

    /**
     *
     * @param allFiles                所有的合并文件(包含了不需要合并的文件)
     * @param need2Merges             需要合并的文件名称
     * @param mergeSaveFile           合并后的文件
     * @param delOriginMergeFiles     是否删除合并的源文件
     */
    public static void merge(LinkedList<File> allFiles, Set<String> need2Merges, File mergeSaveFile, boolean delOriginMergeFiles){
        byte[] bytes;
        for (File file: allFiles) {
            try {
                if(!need2Merges.contains(file.getName())){
                    System.out.printf("当前需要文件不需要合并，即将跳过;fileName:%s\n",file.getName());
                    continue;
                }
                bytes = org.apache.commons.io.FileUtils.readFileToByteArray(file);
                org.apache.commons.io.FileUtils.writeByteArrayToFile(mergeSaveFile,bytes,true);
                if(delOriginMergeFiles){
                    System.out.printf("即将删除源文件，文件名称:%s\n",file.getName());
                    Files.delete(file.toPath());
                }
            } catch (IOException e) {
                new RuntimeException("合并文件异常",e);
            }
        }
    }
}
